﻿#pragma once
// 游戏玩家类，父类
// 子类有玩家类和机器人类

#ifndef PLAYER_H
#define PLAYER_H

#include <QObject>

#include "cards.h"

class Player : public QObject {
	Q_OBJECT
public:
	enum Role { Lord, Farmer };  // 角色（庄家和玩家）
	enum Sex { Man, Woman };     // 性别
	enum Direction { Left, Right };  // 头像的显示方位，四个个玩家方位不同，看向牌桌
	enum Type { Robot, User, UnKnow };  // 枚举 玩家的类型
	explicit Player(QObject* parent = nullptr);
	explicit Player(QString name, QObject* parent = nullptr); //有参构造，定义了玩家的名字

	// 名字
	void setName(QString name);
	QString getName();

	// 角色
	void setRole(Role role);
	Role getRole();

	// 性别
	void setSex(Sex sex);
	Sex getSex();

	// 方位
	void setDirection(Direction direction);
	Direction getDirection();

	// 玩家类型
	void setType(Type type);
	Type getType();

	// 玩家的分数
	void setScore(int score);
	int getScore();

	// 游戏结果
	void setWin(bool flag);
	bool isWin();

	// 提供当前对象的上家/下家对象
	void setPrevPlayer(Player* player);
	void setNextPlayer(Player* player);
	Player* getPrevPlayer();
	Player* getNextPlayer();

	/* 存储扑克牌(发牌的时候得到的) */
	// 一张一张发牌
	void storeDispatchCard(const Card& card);
	// 发多张牌
	void storeDispatchCard(const Cards& cards);

	// 得到所有的牌
	Cards getCards();

	// 清空玩家手中所有的牌
	void clearCards();

	// 出牌，出cards牌后，会remove掉
	void playHand(Cards& cards);

	// 虚函数(暂时没用上)
	virtual void prepareCallLord(); 
	virtual void preparePlayHand(); 
	virtual void thinkCallLord();	
	virtual void thinkPlayHand();

signals:
	// 通知已经叫地主下注
	void notifyGrabLordBet(Player* player, int bet);
	// 通知已经出牌
	void notifyPlayHand(Player* player, Cards& card);
	// 通知已经发牌了
	void notifyPickCards(Player* player, const Cards& cards);

protected:
	int m_score = 0;// 得分（输赢的凭证）
	QString m_name; // 姓名
	Role m_role;    // 角色（地主or农民）
	Sex m_sex;	//性别
	Direction m_direction; // 头像的显示方位，三个玩家方位不同，看向牌桌
	Type m_type;    //玩家的类型，包括机器人还是真人
	bool m_isWin = false;   //存储胜利结果，true则赢
	Player* m_prev = nullptr;  //上家
	Player* m_next = nullptr;  //下家
	Cards m_cards;             // 存储多张扑克牌(玩家手中的牌)
	Player* m_pendPlayer = nullptr;  //出牌的对象
};

#endif  // PLAYER_H
